package com.jacklei.ch11;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
* 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。

 

示例 1：


输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出：[1,2,3,6,9,8,7,4,5]
示例 2：


输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出：[1,2,3,4,8,12,11,10,9,5,6,7]

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。*/
public class SpiralMatrix {
    public static void main(String[] args) {
        SpiralMatrix spiralMatrix = new SpiralMatrix();
        List<Integer> list = spiralMatrix.spiralOrder(new int[][]{{1,2},{3,4}}/*{1, 2, 3,4}, { 5, 6,7,8}, { 9,10,11,12}}*/);
        System.out.println(list.toString());
    }
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        return order(matrix,list,0,0,matrix.length-1,matrix[0].length-1);
    }

    private List<Integer> order(int[][] matrix, List<Integer> list, int i, int j, int k, int l) {
        if(i>k || j > l) return list;
        if(i == k){
            //在同一行
            for (int p = j; p <= l; p++) {
                list.add(matrix[i][p]);
            }
            return list;
        }else if(j == l){
            //在同一列
            for (int p = i; p <= k; p++) {
                list.add(matrix[p][l]);
            }
            return list;
        }else {
            //左到右(上)
            for (int p = j; p < l; p++) {
                list.add(matrix[i][p]);
            }
            //上到下（右）
            for (int p = i; p < k; p++) {
                list.add(matrix[p][l]);
            }
            //从右到左
            for (int p = l; p > j; p--) {
                list.add(matrix[k][p]);
            }
            //从下往上
            for (int p = k; p > i; p--) {
                list.add(matrix[p][j]);
            }
        }
        return order(matrix,list,i+1,j+1,k-1,l-1);

    }


}
